package br.com.conhecimento.core.util;

import java.math.BigDecimal;
import java.util.Date;
import java.util.Random;
import java.util.regex.Pattern;

/**
 * Classe responsável por validações e tratamentos do campo senha.
 * @author brunogiannella
 *
 */
public class SenhaUtil {

	/**
	 * Construtor privado. Os métodos devem ser estáticos
	 */
	public SenhaUtil() {}

	public static boolean validaSenhaNumeroCaracteres(String senha) {
		/**
		 * Verifica se contém apenas números com 6 dígitos
		 */
		Pattern pNumeros = Pattern.compile("[0-9]{6}");
		if (!pNumeros.matcher(senha).matches())
			return false;
		
		return true;
	}
	
	public static boolean validaSenhaSequencial(String senha) {
		
		/**
		 * verificando se a senha é sequencial (ex.: 123456, 23456, 654321, 765432... etc) 
		 */
		int anterior = Integer.valueOf(senha.substring(0, 1)); //pegando o primeiro número da senha
		/**
		 * variáveis auxiliares
		 */
		boolean sequencia = false;
		boolean crescente = true;
		/**
		 * se o próximo número da senha for maior que o primeiro numero,
		 * a suposta sequencia seria descrescente
		 */
		if(Integer.valueOf(senha.substring(1, 2)) < anterior)
			crescente = false;
		/**
		 * percorrendo a senha
		 */
		for(int i=1; i<senha.length(); i++) {
			int atual = Integer.valueOf(senha.substring(i, i+1)); //pegando o caracter atual
			if((crescente && atual == anterior+1) || (!crescente && atual == anterior-1))
				sequencia = true;
			else {
				sequencia = false;
				break;
			}
			anterior = atual; //qndo o laço for rodado novamente, o anterior será o atual
		}
		
		if (sequencia) return false;
		
		return true;
	}
	
	public static boolean validaSenhaDataNascimento(String senha, Date dataNascimento) {
		
		String dataNasc = DateUtil.formataData(dataNascimento);
		
		/**
		 * Verificando se a senha não é igual à data de nascimento do associado no formato DDMMAA e AAMMDD
		 */
		if (dataNasc != null) {
			String[] aDataNasc = dataNasc.split("/");
			aDataNasc[2] = aDataNasc[2].substring(2, 4); //Deixando a data com apenas dois dígitos
			/**
			 * Definindo os formatos possíveis de data
			 */
			String DDMMAA = aDataNasc[0]+aDataNasc[1]+aDataNasc[2]; //data no formato DDMMAA
			String AAMMDD = aDataNasc[2]+aDataNasc[1]+aDataNasc[0]; //data no formato AAMMDD
			
			/**
			 * comparando a senha com os formatos definidos acima
			 */
			if (senha.equals(DDMMAA) || senha.equals(AAMMDD)) return false;
		}
		
		return true;
	}
	
	/**
	 * Metodo responsável pela validação da senha com o CPF
	 * @param senha
	 * @param cpf
	 * @return
	 */
	public static boolean validaSenhaCpf(String senha, BigDecimal cpf) {
		
		String cpfFormatado = BigDecimalUtil.BigDecimal2String(cpf);
		
		if(cpfFormatado != null && cpfFormatado.length() >= 6) {
			String cpfSenha = cpfFormatado.substring(0, 6);
			
			if(senha.equals(cpfSenha)) {
				return false;
			}
		}
		
		return true;
	}
	
	public static boolean validaSenhaNumerosIguais(String senha) {
		
	/**
	 * verificando se a senha não contém números iguais
	 */
		if (senha.equals("000000") || senha.equals("111111") || 
			senha.equals("222222") || senha.equals("333333") || 
			senha.equals("444444") || senha.equals("555555") || 
			senha.equals("666666") || senha.equals("777777") || 
			senha.equals("888888") || senha.equals("999999"))
			return false;
		
		return true;
	}
	
	
	/**
	 * Método responsável em gerar senha numérica aleatória com tamanho definido
	 * a partir de um conjunto de números. O numero gerado será possível 
	 * caso tenha mais números nao repetidos.
	 * 
	 * @param cpfSocio String
	 * @param tamanhoSenha Integer
	 * @return String
	 * 
	 * @author brunogiannella
	 * 
	 */
	@SuppressWarnings("unused")
	public static String geraSenhaResgate(String conjuntoDeNumeros, final Integer tamanhoSenha){
		int nextInt = new Random().nextInt(5400);
		nextInt = Math.abs(nextInt);
		conjuntoDeNumeros  = conjuntoDeNumeros +nextInt;
		Random random = new Random();
		StringBuilder numerosGerados = new StringBuilder();
		if(conjuntoDeNumeros == null){
			return "";
		}else{
			Long numeroFormatado = CNPJCPFUtil.retiraCaracteresAlpha(conjuntoDeNumeros);
			String numerosOK = String.valueOf(numeroFormatado);
			int cont = 0;
			if(numerosOK.length() >= tamanhoSenha){
				for (int j = 0; j < (numerosOK.length() + tamanhoSenha); j++) {
					char valor = numerosOK.charAt(random.nextInt(numerosOK.length()));
					Pattern pattern = Pattern.compile(String.valueOf(valor));
					Boolean existe = Boolean.FALSE;
					while(pattern.matcher(numerosGerados.toString()).find()){
						existe = Boolean.TRUE;
						cont++;
						j = 0;
						break;
					}
					if(!existe){
						numerosGerados.append(valor);
					}
					if(numerosGerados.length() == tamanhoSenha){
						break;
					}
					if(cont == (tamanhoSenha * tamanhoSenha)){
						break;
					}
				}
			}else{
				return geraSenhaResgate(numerosGerados.toString(),tamanhoSenha);
			}

		}
		return numerosGerados.toString();
	}
	

}